package shuanfa.hashtab;

import java.util.Scanner;

public class HashTabDemo {
    public static void main(String[] args) {
        HashTab hashTab = new HashTab(7);
        String key="";
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("add: 添加雇员");
            System.out.println("list: 显示雇员");
            System.out.println("exit: 退出系统");
            key=scanner.next();
            switch (key){
                case "add":
                    System.out.println("输入id");
                    int id=scanner.nextInt();
                    System.out.println("输入名字");
                    String name=scanner.next();
                    //创建雇员
                    Emp emp=new Emp(id,name);
                    hashTab.add(emp);
                    break;
                case "list":
                    hashTab.list();
                    break;
                case "exit":
                    scanner.close();
                    break;
                default:
                    break;
            }
        }
    }
}

//表示一个雇员
class Emp {
    public int id;
    public String name;
    public Emp next; //next默认为空
    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
//创建HashTab 管理多条链表
class HashTab{
    private EmpLinkedList[] empLinkedLists;
    private int size;//表示有多少条链表
    public HashTab(int size){
        this.size=size;
        //初始化empLinkedLists
        empLinkedLists=new EmpLinkedList[size];
        //?留个坑,这时不要分别初始化每个链表
        for (int i = 0; i < size; i++) {
            empLinkedLists[i]=new EmpLinkedList();
        }
    }
    //添加雇员
    public void add(Emp emp){
        //根据员工id得到该员工应当添加到哪条链表
        int empLinkedListNo=hashFun(emp.id);
        //将emp 将emp添加到对应的链表中
        empLinkedLists[empLinkedListNo].add(emp);
    }
    //遍历所有的链表
    public void list(){
        for (int i = 0; i < size; i++) {
            empLinkedLists[i].list(i);
        }
    }
    //添加散列函数
    public int hashFun(int id){
        return id%size;
    }
}
//创建EmpLinkedList,表示链表
class EmpLinkedList{
    //头指针，执行第一个Emp,因此我们这个链表的head,是指向第一个Emp
    private Emp head;//默认为空
    //添加雇员到链表
    //说明
    //1 假定，当添加雇员时，id是自增长，即id的分配总是从小到大
    //因此我们将该雇员直接加入到本链表的最后即可
    public void add(Emp emp){
        if (head==null){
            head=emp;
            return;
        }
        //如果不是第一个，则使用一个辅助指针，帮助定位到最后
        Emp curEmp=head;
        while (true){
            if (curEmp.next==null){//说明链表到最后
                break;
            }
            curEmp=curEmp.next;//后移
        }
        //退出时直接将emp加入链表
        curEmp.next=emp;
    }

    //遍历链表的雇员信息
    public void list(int no){
        if (head==null){
            System.out.println("第"+(no+1)+"链表为空");
            return;
        }
        System.out.println("第"+(no+1)+"链表的信息为");
        Emp curEmp=head;//定义一个辅助指针
        while (true){
            System.out.printf("==> id=%d name=%s\t",curEmp.id,curEmp.name);
            if (curEmp.next==null){//说明已经到最后一个节点
                return;
            }
            curEmp=curEmp.next;//后移，遍历
            System.out.println();
        }
    }
}